home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 11 / Cream of the Crop 11-1.iso / educate / wordy402.zip / SEARCH.C < prev    next >
C/C++ Source or Header  |  1995-12-17  |  4KB  |  158 lines

  1. #include "srch.h"
  2. //srch.h contains all include files, some prototypes, etc.
  3.  
  4. #define ARGCOUNT 2
  5. #define BAD_ARGS 2
  6. #define BUZZ 60
  7. #define DELAY1 500
  8. #define FILE_ERROR 10
  9. #define MAXFILENAMELEN 40
  10. #define FALSE 0
  11. #define TRUE 1
  12.  
  13.  
  14.  
  15. Rflag lookup2( char *, char * );
  16. int bzz();
  17. //Other prototypes found in srch.h
  18.  
  19. void main( int argc, char **argv )
  20. {
  21.    char searchfile [MAXFILENAMELEN];
  22.  
  23.       if( argc < ARGCOUNT )
  24.           {
  25.           puts( "\nFormat: search word [filename]" );
  26.           exit( BAD_ARGS );
  27.           }
  28.        else
  29.           if( argc == ARGCOUNT )
  30.              strcpy( searchfile, "word.lst" );
  31.           else
  32.               strcpy( searchfile, *(argv + 2) );
  33.  
  34.  
  35.       if( lookup2( *(argv + 1), searchfile ) )
  36.          printf( "\7\7\7%s found!", *(argv + 1) );
  37.       else
  38.          if( bzz() )
  39.             printf( "%s NOT found.", *(argv + 1) );
  40.         
  41.  
  42. }
  43.  
  44. /**********************************************************************/
  45.  
  46. int bzz()
  47. {
  48.       sound( BUZZ );
  49.       delay( DELAY1 );
  50.       nosound();
  51.       
  52.       return( TRUE );
  53. }
  54.  
  55. Rflag b_search( char *search_word, FILE *fp, long left, long right )
  56. {
  57.    int result;
  58.    long middle;
  59.    char discard [MAX_WLEN + 1],
  60.         working [MAX_WLEN + 1],
  61.         target [MAX_WLEN];
  62.     Rflag bflag = FAIL;
  63.     
  64.       strcpy( working, search_word );
  65.       strcat( working, "\n" );   //Because fgets() reads CR's
  66.  
  67.         while( right - left > MAX_SPAN )
  68.             {
  69.             middle = ( left + right ) / 2;
  70.             fseek( fp, middle, SEEK_SET );
  71.             fgets( discard, MAX_WLEN + 1, fp ); //Throw away partial(?) string.
  72.             fgets( target, MAX_WLEN, fp );
  73.  
  74.             result = strcmp( working, target );
  75.  
  76.          if( !result )
  77.             { bflag = SUCCESS; break; }
  78.  
  79.          if( result < 0 )
  80.             right = middle;
  81.          
  82.          else
  83.             if( result > 0 )
  84.                left = middle;
  85.          
  86.             else
  87.                {
  88.                puts( "Error in strcmp() in BINARY SEARCH !" );
  89.                     exit( COMPARISON_ERROR ); //Error in strcmp() !
  90.                     }
  91.             }
  92.          
  93.       if( !bflag )
  94.          bflag = l_search( search_word, fp );
  95.  
  96.       return( bflag );
  97.  
  98. }
  99.  
  100.  
  101. Rflag l_search( char *search_word, FILE *fp )
  102. {                                          
  103.     long backstep;
  104.     int test,
  105.          i;
  106.     char target [MAX_WLEN],
  107.           work [MAX_WLEN + 1],
  108.           CR_str [] = "\n";
  109.     Rflag flag = FAIL;
  110.  
  111.  
  112.         if( ( backstep = ftell( fp ) ) > 2 * MAX_SPAN )
  113.             backstep = -1L * ( 2 * MAX_SPAN );     //Else backstep to file begin.
  114.         else
  115.             backstep = -1L * backstep;
  116.  
  117.         fseek( fp, backstep, SEEK_CUR );
  118.  
  119.         strcpy( work, search_word );  //Make working copy.
  120.         strcat( work, CR_str );       //Because fgets() reads CR's
  121.  
  122.         for( i = 0; i <= MAXTESTS; i++ )
  123.             {
  124.             if( !( fgets( target, MAX_WLEN, fp ) ) ) break; //EOF!
  125.             
  126.  
  127.             test = strcmp( work, target );
  128.             if( test < 0 && i > 0 )
  129.                 break;   //Passed possible match
  130.             if( !test )
  131.                 { flag = SUCCESS; break; }
  132.             }
  133.  
  134.         return ( flag );
  135. }
  136.  
  137. Rflag lookup2( char *tstword, char *filename )
  138. {
  139.     FILE *fptr;
  140.     long file_end; //Byte count of eof [length of file]
  141.    const long file_begin = 0L;   
  142.    Rflag rflag;
  143.  
  144.       if( NULL == ( fptr = fopen( filename, "r" ) ) )
  145.          exit( FILE_ERROR );
  146.  
  147.         file_end = filelength( fileno( fptr ) );
  148.  
  149.         rflag =  b_search( tstword, fptr, file_begin, file_end );
  150.                     //  ^^^^Preserves filepos in call!
  151.  
  152.         fclose( fptr );
  153.  
  154.       return( rflag );
  155.  
  156. }
  157.  
  158.